package core

import (
	"fmt"
	"gitee.ltd/lxh/logger"
	"github.com/gin-gonic/gin"
	"net"
	"net/http"
	"os"
	"strings"
)

// NoMethodHandler 请求方式不对
func NoMethodHandler() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		R(ctx).FailWithMessageAndCode(fmt.Sprintf("不支持%v请求", ctx.Request.Method), http.StatusMethodNotAllowed)
		ctx.Abort()
	}
}

// NoRouteHandler 404异常处理
func NoRouteHandler() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		R(ctx).FailWithMessageAndCode("请求接口不存在", http.StatusNotFound)
		ctx.Abort()
	}
}

// Recovery Panic捕获
func Recovery() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		defer func() {
			if err := recover(); err != nil {
				logger.Say.Errorf("系统错误: %v", err)
				var brokenPipe bool
				if ne, ok := err.(*net.OpError); ok {
					if se, ok := ne.Err.(*os.SyscallError); ok {
						if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") {
							brokenPipe = true
						}
					}
				}
				if brokenPipe {
					logger.Say.Errorf("%s", err)
				}
				R(ctx).FailWithMessage("服务器异常，请联系管理员")
				ctx.Abort()
			}
		}()
		ctx.Next()
	}
}
